﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Imports Commander_Wars.Spieletools
Public Class ObjektmarkiertesFeld
    Public X As Integer
    Public Y As Integer
    Public Shared Texturen As Textur() = {}
    Dim ID As Integer = 0
    Dim intColor As Color
    Dim AktuellerFarbwertInd As Integer
    Structure Textur
        Public Sub New(ByVal Texturname As String)
            Texturnamen = Texturname

            Dim B As Image
            If Hauptmenue.ZoomedIn Then
                B = Image.FromFile(DataSettings.Resourcenpfad + "Markierte Felder\Zoomed In\" + Texturname + ".png")
            Else
                B = Image.FromFile(DataSettings.Resourcenpfad + "Markierte Felder\Zoomed Out\" + Texturname + ".png")
            End If
            TexturBilde = Grafikengine.LoadTexture(B)
        End Sub
        Private Texturnamen As String
        Public ReadOnly Property Texturname() As String
            Get
                Return Texturnamen
            End Get
        End Property
        Private TexturBilde As Texture
        Public ReadOnly Property TexturBild() As Texture
            Get
                Return TexturBilde
            End Get
        End Property
        Public Shared Function GetTextur(ByVal Id As Integer) As Texture
            Return Texturen(Id).TexturBilde
        End Function
    End Structure
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="neuX"></param>
    ''' <param name="neuY"></param>
    ''' <remarks></remarks>
    Public Sub New(ByVal neuX As Integer, ByVal neuY As Integer, ByVal Farbe As Color, Optional ByVal Farbwert As String = "Gruen")
        X = neuX
        Y = neuY
        intColor = Farbe

        ID = LoadTextur("MarkiertesFeld+" + Farbwert)
        If DataSettings.draw3D Then
            AktuellerFarbwertInd = LoadFarbwert(getFarbeAusFarbwert(Farbwert))
            If Objektverwalter.MarkierteFelder.Count = 1 Then
                'Hmm, entweder auf eins minimiert, aber... hier kommen wir nur rein, wenn wir ein neues erschaffen, also vermutlich HIER nur, wenn wir seit langem mal wieder eins erschaffen.
                FarbProzent = 1
            End If
        End If
    End Sub
    Public Shared Function LoadTextur(ByVal Name As String) As Integer
        For I = 0 To Texturen.Length - 1
            If Texturen(I).Texturname = Name Then
                Return I
            End If
        Next
        Array.Resize(Texturen, Texturen.Length + 1)
        Texturen(Texturen.Length - 1) = New Textur(Name)
        Return Texturen.Length - 1
    End Function
    Public Sub Malen()
        If DataSettings.draw3D Then

        ElseIf DataSettings._2D_3D_Malen Then
            Dim cube(3) As CustomVertex.PositionTextured
            cube(0) = New CustomVertex.PositionTextured(0, 0, 0, Objektverwalter.FrameMarkierteFelder * 0.5, 1)
            cube(1) = New CustomVertex.PositionTextured(0, 0, 1, Objektverwalter.FrameMarkierteFelder * 0.5, 0)
            cube(2) = New CustomVertex.PositionTextured(1, 0, 0, Objektverwalter.FrameMarkierteFelder * 0.5 + 0.5, 1)
            cube(3) = New CustomVertex.PositionTextured(1, 0, 1, Objektverwalter.FrameMarkierteFelder * 0.5 + 0.5, 0)

            Grafikengine.malen2Din3D(ObjektSpielfeld.CalcDraw2D3DVec(X, ObjektSpielfeld.SpielfeldLayer.MarkierteFelder, Y), cube, Textur.GetTextur(ID), intColor)
        Else
            'Welchen Teil des Bildes wir malen wollen
            Dim sngRotation As Double = 0
            'pruefen ob wir aus den Screenbereich laufen

            'Festlegen welchen Bereich vom Bitmap wir kopieren

            'Welcher Teil der Textur soll gemalt werden Nichts bedeutet gesamtes Bild

            With Grafikengine.recBild
                .X = Hauptmenue.Feldbreite * Objektverwalter.FrameMarkierteFelder : .Width = Hauptmenue.Feldbreite
                .Y = 0 : .Height = Hauptmenue.Feldbreite
            End With
            'Falls der Zoomfaktor groesser 1 ist muessen einige Raender abgeschnitten werden
            'Achtung Rotationszentrum ist auch Ausgangspunkt der bemalung
            With Grafikengine.ptfRotCenter
                .X = Hauptmenue.Feldbreite / 2
                .Y = Hauptmenue.Feldbreite / 2
            End With

            Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * X + Objektverwalter.Spielfeld.BildschirmKooX, Hauptmenue.Feldbreite * Y + Objektverwalter.Spielfeld.BildschirmKooY)

            'Ausschnitte in den Backbuffer zeichnen
            'Wo wird das Bild gezeichnet
            '16 ist die Breite eines Feldes 8 die Haelfte das heisst wir ermitteln den Mittelpunkt des Feldes und ziehen die Haelfte der Groesse der Einheit ab
            '... und wie breit ist es
            With Grafikengine.szfScale
                .Height = Hauptmenue.Feldbreite
                .Width = Hauptmenue.Feldbreite
            End With

            'jetzt wird es in den Backbuffer gezeichnet
            Grafikengine.Sprite.Draw2D(Textur.GetTextur(ID), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)

            'Wir malen das Leben verloren Symbol
        End If
    End Sub
    Public Shared Sub DeleteTexturen()
        For i = 0 To Texturen.Length - 1
            Texturen(i).TexturBild.Dispose()
            Texturen(i) = Nothing
        Next
        Array.Resize(Texturen, 0)
        Grafikengine.Grafikkarte.EvictManagedResources()
    End Sub


#Region "3D Markierungen"
    Shared Farbwerte() As Color = {}
    Shared AktuelleFarbwerte() As Color = {}
    Shared FarbProzent As Single
    Shared Function getFarbeAusFarbwert(ByVal Farbwert As String) As Color
        Select Case Farbwert.ToLower
            Case "gruen"
                Return Color.FromArgb(255, 0, 200, 0)
            Case "rot"
                Return Color.FromArgb(255, 255, 0, 0)
            Case Else
                Return Color.FromArgb(255, 0, 0, 255)
        End Select
    End Function
    Shared Function LoadFarbwert(ByVal Farbe As Color) As Integer
        For i = 0 To Farbwerte.Length - 1
            If Farbwerte(i) = Farbe Then
                Return i
            End If
        Next
        Array.Resize(Farbwerte, Farbwerte.Length + 1)
        Farbwerte(Farbwerte.Length - 1) = Farbe
        Array.Resize(AktuelleFarbwerte, Farbwerte.Length)
        Return Farbwerte.Length - 1
    End Function

    ''' <summary>
    ''' Bitte jeden Frame aufrufen. Im endeffekt werden einfach die Farbwerte ein bischen heller und dunkler gemacht.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub FarbwerteBerechnen()
        If Objektverwalter.MarkierteFelder.Count > 0 Then 'Wenn es keine Markierten Felder gibt, ist das unnoetig!
            FarbProzent -= 0.17
            If FarbProzent < -1 Then FarbProzent = 1
            For i = 0 To Farbwerte.Length - 1
                AktuelleFarbwerte(i) = getMischfarbe(Farbwerte(i), Color.FromArgb(255, 255, 255, 255), Math.Abs(FarbProzent))
            Next
        End If
    End Sub
    Public Shared Function getFeldFarbe(ByVal X As Integer, ByVal Y As Integer) As Color
        For Each Feld In Objektverwalter.MarkierteFelder
            If Feld.X = X Then
                If Feld.Y = Y Then
                    Return AktuelleFarbwerte(Feld.AktuellerFarbwertInd)
                End If
            End If
        Next
        Return Color.FromArgb(255, 255, 255, 255)
    End Function
    Public Shared Function getFeldFarbe(ByVal X As Integer, ByVal Y As Integer, ByVal SpielerFarbe As Color, ByRef Veraendert As Boolean) As Color
        For Each Feld In Objektverwalter.MarkierteFelder
            If Feld.X = X Then
                If Feld.Y = Y Then
                    Veraendert = True
                    Return getMischfarbe(Farbwerte(Feld.AktuellerFarbwertInd), SpielerFarbe, Math.Abs(FarbProzent))
                End If
            End If
        Next
        Veraendert = False
        Return SpielerFarbe
    End Function
    Public Shared Function getMischfarbe(ByVal Farbe1 As Color, ByVal Farbe2 As Color, ByVal Farbe1Proz As Single, Optional ByVal TransparentMischen As Boolean = True) As Color
        If TransparentMischen Then
            Return Color.FromArgb(Farbe1.A * Farbe1Proz + Farbe2.A * (1 - Farbe1Proz), Farbe1.R * Farbe1Proz + Farbe2.R * (1 - Farbe1Proz), Farbe1.G * Farbe1Proz + Farbe2.G * (1 - Farbe1Proz), Farbe1.B * Farbe1Proz + Farbe2.B * (1 - Farbe1Proz))
        Else
            Return Color.FromArgb(Farbe1.A, Farbe1.R * Farbe1Proz + Farbe2.R * (1 - Farbe1Proz), Farbe1.G * Farbe1Proz + Farbe2.G * (1 - Farbe1Proz), Farbe1.B * Farbe1Proz + Farbe2.B * (1 - Farbe1Proz))
        End If
    End Function

#End Region
End Class
